<?php
/**
 * Description of fiche produit
 *
 * @author Gmax
 */
class modules_boutique_produit extends modele_publication {
    public $type = 'produit';
    
    private $_type_produit_id;
    private $_marque_id = 0;
    private $_marque = null;
    private $_type_produit = '';
    private $_prix = 0;
    
    private $_items = array();
    
    private $_statut_produit = 0;
    
    public function __construct($id = null) {
        parent::__construct($id);
        if($this->getId()>0){
            $this->_getDatasProduit();
            $this->_getItemsProduit();
        }
    }
    
    private function _getDatasProduit(){
        $sqlDatas = 'SELECT a.*, ';
        $sqlDatas .= 'tp.nom as type_produit ';
        $sqlDatas .= 'FROM '.PWE::getPrefixBdd().'boutique_produit AS a ';
        $sqlDatas .= 'LEFT JOIN '.PWE::getPrefixBdd().'type_boutique_produit AS tp ON tp.id = a.type_boutique_produit_id ';
        $sqlDatas .= 'WHERE a.publication_id = '.$this->getId();

        $datas = $this->_getOneResult($sqlDatas);
        if($datas){
            $this->_statut_produit = $datas['statut_produit'];
            $this->_prix = $datas['prix'];
            $this->_type_produit_id = $datas['type_boutique_produit_id'];
            $this->_type_produit = $datas['type_produit'];
            $this->_marque_id = $datas['marque_id'];
            if($this->_marque_id>0){
                $this->_marque = new modele_category($this->_marque_id);
            }
            
        }
    }
    
    private function _getItemsProduit(){
        $sqlItem = 'SELECT i.*, ';
        $sqlItem .= 'ti.nom as type_item ';
        $sqlItem .= 'FROM '.PWE::getPrefixBdd().'item_boutique_produit AS i ';
        $sqlItem .= 'LEFT JOIN '.PWE::getPrefixBdd().'type_item_boutique AS ti ON ti.id = i.type_item_boutique_id ';
        $sqlItem .= 'WHERE i.boutique_produit_id = '.$this->getId().' ';
        $sqlItem .= 'ORDER BY i.ordre';
        
        $results = bdd_sql::doSql($sqlItem);
        if($results['count']>0){
            $this->_items = array();
            foreach($results['results'] as $item){
                $this->_items[] = array(
                    'id'=>$item['id'],
                    'type_id'=>$item['type_item_boutique_id'],
                    'type'=>$item['type_item'],
                    'title'=>$this->outputFormat($item['title']),
                    'value'=>$this->outputFormat($item['value']),
                    'ordre'=>$item['ordre']
                );
            }
        }
    }
    
    
    ///////////////////////////////////// le produit
    
    /**
     * renvoi l'id category de la marque du produit
     * @return int
     */
    public function getMarqueId(){
        return $this->_marque_id;
    }
    /**
     * renvoi la category de marque du produit
     * @return \modele_category
     */
    public function getMarque(){
        return ($this->_marque!==null&&$this->_marque->getId()>0)?$this->_marque:null;
    }
    
    /**
     * 
     * @return int
     */
    public function getStatutProduit(){
        return $this->_statut_produit;
    }
    
    /**
     * renvoi le prix du produit
     * @return string
     */
    public function getPrix(){
        return $this->_prix;
    }
    /**
     * renvoi le type_produit_id
     * @return int
     */
    public function getTypeProduitId(){
        return $this->_type_produit_id;
    }
    /**
     * renvoi le type de produit 
     * @param boolean $input
     * @return string 
     */
    public function getTypeProduit($input=false){
        if($input){
            return $this->inputFormat($this->_type_produit);
        }else{
            return $this->outputFormat($this->_type_produit);
        }
    }
            
    /**
     * retourne la liste des items
     * @return array id,type,type_item_id,title,value,ordre
     */
    public function getItems(){
        return $this->_items;
    }
    
    /**
     * retourne la liste des items par type
     * @param string $type
     * @return array id,type,type_item_id,title,value,ordre
     */
    public function getItemByType($type){
        $retour = array();
        foreach($this->getItems() as $item){
            if($item['type']===$type){
                $retour[] = $item;
            }
        }
        
        return $retour;
    }
    
    /**
     * retourne la liste des items par son identifiant
     * @param int $id
     * @return array id,type,type_item_id,title,value,ordre
     */
    public function getItemById($id){
        $retour = null;
        foreach($this->getItems() as $item){
            if($item['id']===$id){
                $retour = $item;
            }
        }
        return $retour;
    }
    
    /**
     * retourne l'item selon son ordre
     * @param int $id
     * @return array id,type,type_item_id,title,value,ordre
     */
    public function getItemByOrder($order){
        $retour = null;
        foreach($this->getItems() as $item){
            if($item['ordre']==$order){
                $retour = $item;
            }
        }
        return $retour;
    }
    /**
     * retourne l'item suivant selon l'ordre
     * @param int $order
     * @return array
     */
    public function getNextOrderItem($order){
        $retour = null;
        foreach($this->getItems() as $item){
            if($item['ordre']>$order){
                $retour = $item;
                break;
            }
        }
        return $retour;
    }
    
    /**
     * retourne l'item suivant selon l'ordre
     * @param int $order
     * @return array
     */
    public function getPrevOrderItem($order){
        $retour = null;
        foreach($this->getItems() as $item){
            if($item['ordre']<$order){
                $retour = $item;
            }else{
                break;
            }
        }
        return $retour;
    }
    
    public function addItem($datas){
        $queryMax = 'SELECT MAX(ordre) as max FROM '.PWE::getPrefixBdd().'item_boutique_produit WHERE boutique_produit_id='.$this->getId();
        $max = $this->_getOneResult($queryMax);
        if($max &&$max['max']!=null){
            $order = $max['max']+1;
        }else{
            $order = 1;
        }
        
        $sqlQuery = 'INSERT INTO '.PWE::getPrefixBdd().'item_boutique_produit '
            . '(boutique_produit_id,title,type_item_boutique_id,value,ordre) '
            . 'VALUES ('
            . $this->getId()
            . ',"'.$this->inputFormat($datas['title']).'"'
            . ','.$datas['type_item_boutique_id']
            . ',"'.$this->inputFormat($datas['value']).'"'
            . ','.$order
            . ')';
        bdd_sql::doSql($sqlQuery);
        
        $this->_getItemsProduit();
    }
    
    public function updateItem($datas){
        $sqlQuery = 'UPDATE '.PWE::getPrefixBdd().'item_boutique_produit '
            . 'SET '
            . 'title="'.$this->inputFormat($datas['title']).'"'
            . ',type_item_boutique_id='.$datas['type_item_boutique_id']
            . ',value="'.$this->inputFormat($datas['value']).'"'
            . ' WHERE id='.$datas['id'].' LIMIT 1';
        bdd_sql::doSql($sqlQuery);
        
        $this->_getItemsProduit();
    }
    
    public function removeItem($id){
        $sqlDelete = 'DELETE FROM '.PWE::getPrefixBdd().'item_boutique_produit WHERE id='.$id;
        bdd_sql::doSql($sqlDelete);
        
        $this->_getItemsProduit();
    }
    
    public function upItem($id){
        $item = $this->getItemById($id);
        if($item!==null){
            $currentOrder = $item['ordre'];
            $upItem = $this->getPrevOrderItem($currentOrder);
            if($upItem!==null){
                $sql = 'UPDATE '.PWE::getPrefixBdd().'item_boutique_produit '
                    . 'SET ordre='.($currentOrder)
                    . ' WHERE id='.$upItem['id'].' LIMIT 1';
                bdd_sql::doSql($sql);
            
                $sql = 'UPDATE '.PWE::getPrefixBdd().'item_boutique_produit '
                    . 'SET ordre='.($upItem['ordre'])
                    . ' WHERE id='.$item['id'].' LIMIT 1';
                bdd_sql::doSql($sql);
                
                $this->_getItemsProduit();
            }
        }
    }

    public function downItem($id){
        $item = $this->getItemById($id);
        if($item!==null){
            $currentOrder = $item['ordre'];
            $downItem = $this->getNextOrderItem($currentOrder);
            if($downItem!==null){
                $sql = 'UPDATE '.PWE::getPrefixBdd().'item_boutique_produit '
                    . 'SET ordre='.($currentOrder)
                    . ' WHERE id='.$downItem['id'].' LIMIT 1';
                bdd_sql::doSql($sql);
            
                $sql = 'UPDATE '.PWE::getPrefixBdd().'item_boutique_produit '
                    . 'SET ordre='.($downItem['ordre'])
                    . ' WHERE id='.$item['id'].' LIMIT 1';
                echo $sql;
                bdd_sql::doSql($sql);

                $this->_getItemsProduit();
            }
        }
    }

    /**
     * renvoi le media_id de la fiche technique du produit
     * @return int
     */
    public function getFicheProduitId(){
        $sqlQuery = 'SELECT id FROM '.modele_media::getTable().' WHERE title="fiche_produit_'.$this->getId().'" LIMIT 1';
        $result = $this->_getOneResult($sqlQuery);
        $retour = 0;
        if($result){
            $retour =  $result['id'];
        }
        return $retour;
    }
    /**
     * renvoi la fiche technique pdf du produit
     * @return \modele_media|null
     */
    public function getFicheProduit(){
        $mediaId = $this->getFicheProduitId();
        if($mediaId>0){
            return new modele_media($mediaId);
        }else{
            return null;
        }
    }
    
    /**
     * renvoi le media_id de la fiche option du produit
     * @return int
     */
    public function getFicheOptionId(){
        $sqlQuery = 'SELECT id FROM '.modele_media::getTable().' WHERE title="fiche_option_'.$this->getId().'" LIMIT 1';
        $result = $this->_getOneResult($sqlQuery);
        $retour = 0;
        if($result){
            $retour =  $result['id'];
        }
        return $retour;
    }
    /**
     * renvoi la fiche option pdf du produit
     * @return \modele_media|null
     */
    public function getFicheOption(){
        $mediaId = $this->getFicheOptionId();
        if($mediaId>0){
            return new modele_media($mediaId);
        }else{
            return null;
        }
    }
    
    public function getDatas($input = false) {
        $datas = parent::getDatas($input);
        $datas['marque_id'] = $this->getMarqueId();
        $datas['marque'] = $this->getMarque();
        $datas['statut_produit'] = $this->getStatutProduit();
        $datas['type_produit'] = $this->getTypeProduit();
        $datas['type_produit_id'] = $this->getTypeProduitId();
        $datas['items'] = $this->getItems();
        $datas['prix'] = $this->getPrix();
        
        return $datas;
    }
    
    public function setDatas($datas) {
        parent::setDatas($datas);
        
        foreach($datas as $k=>$v){
            if(substr($k, 0, 1) !== '_') $k = '_'.$k;
            if($k != '_id' && property_exists('modules_boutique_produit',$k)){
                $this->$k = $v;
            }
        }
        
        return true;
    }
    
    public function save() {
        $retour = parent::save();
        if($this->getId()>0){
                        
            $sqlQuery = 'INSERT INTO '.PWE::getPrefixBdd().'boutique_produit ';
            $sqlQuery .= '(publication_id,marque_id,prix,type_boutique_produit_id,statut_produit) ';
            $sqlQuery .= 'VALUES ('.$this->getId()
                . ','.$this->getMarqueId()
                . ',"'.$this->getPrix().'"'
                . ','.$this->getTypeProduitId()
                . ','.$this->getStatutProduit()
                . ')';
            bdd_sql::doSql($sqlQuery,false);
        }
        return $retour;
    }
    
    public function update() {
        $retour = parent::update();
              
        $sqlQuery = 'UPDATE '.PWE::getPrefixBdd().'boutique_produit SET '
            . 'prix="'.$this->getPrix().'"'
            . ',marque_id='.$this->getMarqueId()
            . ',type_boutique_produit_id='.$this->getTypeProduitId()
            . ',statut_produit='.$this->getStatutProduit()
            . ' WHERE publication_id='.$this->getId().' LIMIT 1';
        bdd_sql::doSql($sqlQuery,false);
        return $retour;
    }
    
    public function delete() {
        $sqlDelete = 'DELETE FROM '.PWE::getPrefixBdd().'boutique_produit WHERE publication_id='.$this->getId();
        bdd_sql::doSql($sqlDelete,false);
        return parent::delete();
    }
    
    // méthodes statiques
    /**
     * renvoi la liste des produits
     * @param int $start
     * @param int $limit
     * @param boolean $public default false, si true -> uniquement les biens en ligne
     * @param boolean $dispo default false, si true -> uniquement les biens non vendus
     * @return \modules_immobilier_annonce
     */
    public static function getListe($start=0,$limit=0,$public=false,$dispo=false){
        $sqlQuery = 'SELECT a.publication_id AS id FROM '.PWE::getPrefixBdd().'boutique_produit AS a';
        $sqlQuery .= ' LEFT JOIN '.self::getTable().' AS p on p.id=a.publication_id';
        if($dispo||$public){
            $sqlQuery .= ' WHERE';
            if($public){
                $sqlQuery .= ' p.statut_id=2';
                if($dispo){
                    $sqlQuery .= ' AND a.statut_produit=0';
                }
            }else{
                $sqlQuery .= ' a.statut_produit=0';
            }
        }
        
        $sqlQuery .= ' ORDER BY p.date DESC';
        
        if($limit>0){
            $sqlQuery .= ' LIMIT '.$start.','.$limit;
        }
        $retour = array();
        $results = bdd_sql::doSql($sqlQuery,true,true);
        if($results['count']>0){
            foreach ($results['results'] as $data){
                $annonce = new modules_boutique_produit($data['id']);
                $retour[] = $annonce;
            }
        }
        return $retour;
    }
    /**
     * renvoi le nombre total de fiche produit
     * @param boolean $public default false, si true -> uniquement les biens en ligne
     * @param boolean $dispo default false, si true -> uniquement les biens non vendus
     * @return int
     */
    public static function getNombre($public=false,$dispo=false){
        $sqlQuery = 'SELECT COUNT(a.publication_id) AS nombre FROM '.PWE::getPrefixBdd().'boutique_produit AS a';
        if($dispo||$public){
            if($public){
                $sqlQuery .= ' LEFT JOIN '.self::getTable().' AS p on p.id=a.publication_id';
            }
            $sqlQuery .= ' WHERE';
            if($public){
                $sqlQuery .= ' p.statut_id=2';
                if($dispo){
                    $sqlQuery .= ' AND a.statut_produit=0';
                }
            }else{
                $sqlQuery .= ' a.statut_produit=0';
            }
        }
        
        
        $result = bdd_sql::doSql($sqlQuery);
        $nombre = 0;
        if($result['count']>0){
            $nombre = $result['results'][0]['nombre'];
        }
        
        return $nombre;
    }
    
    /**
     * renvoi le nombre de produit selon l'identifiant de marque fourni
     * @param int $marqueId
     * @return int
     */
    public static function getNombreByMarque($marqueId){
        $sqlQuery = 'SELECT COUNT(publication_id) AS nbr FROM '.PWE::getPrefixBdd().'boutique_produit WHERE marque_id='.$marqueId;
        $results = bdd_sql::doSql($sqlQuery);
        $retour = 0;
        if($results['count']>0){
            $retour = $results['results'][0]['nbr'];
        }
        return $retour;
    }
    /**
     * renvoi la liste de produit selon l'identifiant de marque fourni
     * @param int $marqueId
     * @return \modules_boutique_produit array
     */
    public static function getListeByMarque($marqueId){
        $sqlQuery = 'SELECT publication_id AS id FROM '.PWE::getPrefixBdd().'boutique_produit LEFT JOIN '.PWE::getPrefixBdd().'publication AS pub ON pub.id = publication_id WHERE marque_id='.$marqueId.' ORDER BY pub.order_idx';
        
        $retour = array();
        $results = bdd_sql::doSql($sqlQuery,true);
        if($results['count']>0){
            foreach($results['results'] as $datas){
                $retour[] = new modules_boutique_produit($datas['id']);
            }
        }
        return $retour;
    }

        /**
     * renvoi la liste des types de logement
     * @return array id,nom
     */
    public static function getListeTypeProduit(){
        $sqlQuery = 'SELECT * FROM '.PWE::getPrefixBdd().'type_boutique_produit ORDER BY nom';
        $retour = array();
        $results = bdd_sql::doSql($sqlQuery,true);
        if($results['count']>0){
            foreach($results['results'] as $datas){
                $retour[$datas['id']] = array(
                    'id'=>$datas['id']
                    ,'nom'=>encoding::toUTF8(html_entity_decode(stripslashes($datas['nom'])))
                );
            }
        }
        return $retour;
    }
    
    /**
     * renvoi la liste des marques de produit
     * @return \modele_category array
     */
    public static function getListeMarque(){
        $catMarque = modele_category::findByPermalien('marques','category');
        $retour = array();
        if($catMarque!=null && $catMarque->getId()>0){
            $sqlQuery = 'SELECT * FROM '.PWE::getPrefixBdd().'category WHERE parent_id='.$catMarque->getId().' ORDER BY title';
            $results = bdd_sql::doSql($sqlQuery,true);
            if($results['count']>0){
                foreach($results['results'] as $datas){
                    $retour[] =  new modele_category($datas['id']);
                }
            }
        }
        return $retour;
    }
    
    /**
     * renvoi la liste des types d'item
     * @return array id,nom
     */
    public static function getListeTypeItem(){
        $sqlQuery = 'SELECT * FROM '.PWE::getPrefixBdd().'type_item_boutique ORDER BY id';
        $retour = array();
        $results = bdd_sql::doSql($sqlQuery,true);
        if($results['count']>0){
            foreach($results['results'] as $datas){
                $retour[] = array(
                    'id'=>$datas['id']
                    ,'nom'=>$datas['nom']
                );
            }
        }
        return $retour;
    }
}